import globals from 'globals';
import pluginJs from '@eslint/js';
import tseslint from 'typescript-eslint';
import pluginVue from 'eslint-plugin-vue';
import require from './bin/node-helper/require.js';
import absoluteFilePath from './bin/node-helper/absolute-file-path.js';
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';

// 获得 auto-imports 生成的eslint配置 并导入此
const autoImportsPath = absoluteFilePath('.eslintrc-auto-import.json');
const autoImports = require(autoImportsPath);

/** @type {import('eslint').Linter.Config[]} */
export default [
  { languageOptions: autoImports },
  { files: ['**/*.{js,mjs,cjs,ts,vue}'] },
  { languageOptions: { globals: globals.browser } },
  pluginJs.configs.recommended,
  ...tseslint.configs.recommended,
  ...pluginVue.configs['flat/essential'],
  {
    files: ['**/*.vue'],
    languageOptions: { parserOptions: { parser: tseslint.parser } },
  },
  eslintPluginPrettierRecommended,
  {
    rules: {
      'no-var': 'error', // 禁止使用var
      // ---vue-eslint参考：https://eslint.vuejs.org/rules---
      'vue/multi-word-component-names': 'off',
      'vue/attribute-hyphenation': ['error', 'always'], // vue模板属性中划线
      'vue/component-name-in-template-casing': ['error', 'kebab-case'], // vue模板使用组件名规范
      'vue/html-self-closing': [
        'error',
        {
          html: {
            void: 'always',
            normal: 'always',
            component: 'always',
          },
        },
      ], // 强制自闭合标签
      // ---tslint 规则集参考：https://typescript-eslint.io/rules---
      '@typescript-eslint/no-explicit-any': 'warn', // 允许使用any类型，但是警告（默认即使警告，可以不用声明）
      '@typescript-eslint/no-var-requires': 'warn', // 允许使用require，但是警告(默认不允许)
      '@typescript-eslint/no-empty-function': 'off', // 允许空方法，因为可能是做单例限制构造or被注解修饰的空方法（默认为error）
      '@typescript-eslint/ban-ts-comment': 'off', // 允许@ts- 指令的使用，如@ts-nocheck（默认不允许使用）
      '@typescript-eslint/no-non-null-assertion': 'off', // 允许 非空断言操作符（默认为不允许）
      // '@typescript-eslint/explicit-module-boundary-types': 'off'  // 函数必须定义参数类型和返回类型，默认即是关闭校验
      'no-unused-vars': 'warn',
      '@typescript-eslint/no-unused-vars': 'warn',
      '@typescript-eslint/no-unused-expressions': 'off',
    },
  },
];
